# Gunicorn配置文件
import os
import multiprocessing

# 服务器套接字
bind = "0.0.0.0:5000"
backlog = 2048

# 工作进程 - 容器环境优化
workers = min(multiprocessing.cpu_count() * 2 + 1, int(os.environ.get('GUNICORN_WORKERS', 4)))
worker_class = "sync"
worker_connections = 1000
timeout = 30
keepalive = 2

# 重启 - 防止内存泄漏
max_requests = 1000
max_requests_jitter = 50
preload_app = True

# 日志配置 - 容器友好
log_level = os.environ.get('LOG_LEVEL', 'info').lower()
accesslog = os.environ.get('GUNICORN_ACCESS_LOG', '/app/logs/gunicorn_access.log')
errorlog = os.environ.get('GUNICORN_ERROR_LOG', '/app/logs/gunicorn_error.log')
access_log_format = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s" %(D)s'

# 进程命名
proc_name = "crypto-price-checker"

# 安全限制
limit_request_line = 4094
limit_request_fields = 100
limit_request_field_size = 8190

# 性能优化
worker_tmp_dir = "/dev/shm" if os.path.exists("/dev/shm") else "/tmp"

# 优雅关闭
graceful_timeout = 30

# 用户和组（容器中已经是非root用户）
# user = "appuser"
# group = "appgroup"

# 启动时创建日志目录
def on_starting(server):
    """在服务器启动时创建必要的目录"""
    import os
    log_dir = "/app/logs"
    if not os.path.exists(log_dir):
        try:
            os.makedirs(log_dir, exist_ok=True)
        except PermissionError:
            # 如果无法创建日志目录，使用标准输出
            server.log.warning(f"无法创建日志目录 {log_dir}，将使用标准输出")
            global accesslog, errorlog
            accesslog = "-"
            errorlog = "-"

# 工作进程启动时的钩子
def when_ready(server):
    """服务器准备就绪时的回调"""
    server.log.info("Crypto Price Checker 服务已启动")

# 工作进程退出时的钩子
def worker_exit(server, worker):
    """工作进程退出时的回调"""
    server.log.info(f"Worker {worker.pid} 已退出")